// 1. 类型验证 （基础类型验证）
// * null 和 undefined  是所有类型的子类
let count: number = 100
let str: string = 'str'
let flag: boolean = true
let nul: null = null
let und: undefined = undefined

// 联合类型
let sex: number | string = "sdggggggg"

// 所有类型  any
let any: any = "any"


// 接口 interface  用来验证对象的类型
// ? 选填
// 只读 readonly
interface IUserInfo {
    readonly name: string,
    age: number,
    sex: boolean,
    info?: string
}

let obj: IUserInfo = {
    name: "qq",
    age: 20,
    sex: true
}

// 枚举  enum
// 第一种写法
// enum Direction {
//     Up,
//     Down,
//     Left,
//     Right
// }
// 第二种写法
enum Direction {
    Up = "up",
    Down = "down",
    Left = "left",
    Right = "right"
}

// 数组 arr = [1, 2, 3]
// let arr:[number] = [11]
// 元组 arr = [1, '2', true]
let arr: [string, number] = ['str', 1]

// 泛型

// console.log(Direction.Down)

// 空 void
// function fn(num: number): number {
//     return num
// }

// fn(100)

// fn('str')

// function echo(arg: number): number {
//     return arg
// }

// const num = echo('str')

// <T> ==> 占位
// 泛型
// function echo<T, U>(arg: T, num: U): T {
//     return arg
// }

// const num = echo(888, 'str')

// interface Ilength{
//     length: number,
//     push: () => {}
// }

// // 约束性泛型  ==>  你比程序更清楚
// function echo<T extends Ilength>(arr: T): T {
//     // console.log(arr.length)
//     arr.push()
//     return arr
// }

// // echo('aaa')
// echo([1, 2, 3, 4])

// A
interface IName {
    name: string,
    age: number
}

// B 
interface ISex {
    sex: boolean,
    address: string
}

// C
type allType = IName & ISex
let info: allType = {
    name: "name",
    age: 10,
    sex: false,
    address: "北京"
}


// 类型别名
// type snb = string | number | boolean 

// let aaa: snb = 'sd'

// hook ts react



